package com.automannn.practice.mybatis.paramResolver;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.reflection.ParamNameResolver;
import org.apache.ibatis.session.Configuration;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * @author chenkh
 * @time 2021/10/26 14:00
 */
public class ParamNameResolverTest {
    public static void main(String[] args) throws NoSuchMethodException {

        //xxx: 普通参数不带 @Param
//        Method method = MyDao.class.getDeclaredMethod("queryByParam",String.class);
//        ParamNameResolver paramNameResolver = new ParamNameResolver(new Configuration(),method);
//        Object[] param = new Object[]{"automan",10};

        //xxx: 普通参数带  @Param
//        Method method = MyDao.class.getDeclaredMethod("queryByBean",QueryEntity.class,QueryEntity.class);
//        ParamNameResolver paramNameResolver = new ParamNameResolver(new Configuration(),method);
//        Object[] param = new Object[]{entity,new QueryEntity()};

        //xxx: 普通参数， 不带@Param
        Method method = MyDao.class.getDeclaredMethod("queryByBeanNoParam",QueryEntity.class);
        ParamNameResolver paramNameResolver = new ParamNameResolver(new Configuration(),method);
        Object[] param = new Object[]{new QueryEntity()};

        //xxx: 集合参数不带 @Param
//        Method method = MyDao.class.getDeclaredMethod("queryByList",List.class,List.class);
//        ParamNameResolver paramNameResolver = new ParamNameResolver(new Configuration(),method);

        QueryEntity entity = new QueryEntity();
        entity.setLength(10);
        entity.setPid("L001");
        entity.setPname("test");
        entity.setSize("big");
        List list = new ArrayList();
        list.add(entity);
        List list1 = new ArrayList();
//        Object[] param = new Object[]{list,list1};

        Object object=  paramNameResolver.getNamedParams(param);


        /*xxx: 参数类型与解析的结果之间的关系与区别:
        *   0. 如果参数 为 单参数,且没有注解的情况下，
        *       则直接返回对象
        *   1. 如果参数 为 非集合的普通类型， 并且没有指定 @Param 注解
        *       则返回的map的键为：arg0,arg1,.... 以及 param1,param2... 一直往后排开，二者是对应的
        *   2. 如果参数 为 非集合的普通类型， 但是指定了  @Param 注解
        *       则返回的map的键，跟 没有指定时是一样的，但是 指定名称的用 名称代替，没有指定的，继续用 arg+序号  表示
        *   3. 如果参数 为  单个集合类型
        *       则返回的map的键为: arg0, list, collection
        *   4. 如果参数 为  多个集合类型
        *       则返回的map的键为: arg0, arg1... 以及 param1,param2...
        *
        * */

        /*xxx: 上下文参数的主要区别在于: 是否有 @Param参数， 以及 是单个还是多个参数 */

        System.out.println(object);
    }

    public static interface MyDao{
        void queryByParam(String name);

        void queryByBean(@Param("queryEntity") QueryEntity queryEntity,QueryEntity queryEntity1);

        void queryByBeanNoParam( QueryEntity queryEntity);

        void queryByList(List<QueryEntity> queryEntityList,List<QueryEntity> queryEntityList1);
    }

    public static class QueryEntity{
        private String pid;
        private String pname;
        private String size;
        private Integer length;

        public String getPid() {
            return pid;
        }

        public void setPid(String pid) {
            this.pid = pid;
        }

        public String getPname() {
            return pname;
        }

        public void setPname(String pname) {
            this.pname = pname;
        }

        public String getSize() {
            return size;
        }

        public void setSize(String size) {
            this.size = size;
        }

        public Integer getLength() {
            return length;
        }

        public void setLength(Integer length) {
            this.length = length;
        }
    }
}
